package common

import (
	"fmt"
	"sync"
)

// ============================================================================
// 请求状态标记系统 - 精准控制请求生命周期
// ============================================================================
//
// 功能：
// 1. 定义请求的各种状态（进行中、成功、失败、浏览器断开等）
// 2. 提供状态通知机制，让客户端能及时停止传输
// 3. 避免资源浪费和死锁
//
// 使用场景：
// - 浏览器关闭连接 → 通知客户端停止发送
// - 请求超时 → 通知客户端停止发送
// - 传输完成 → 通知客户端关闭连接
//
// ============================================================================

// RequestStatus 请求状态
type RequestStatus int

const (
	// RequestStatusPending 等待响应
	RequestStatusPending RequestStatus = 0

	// RequestStatusReceiving 正在接收响应
	RequestStatusReceiving RequestStatus = 1

	// RequestStatusCompleted 响应传输完成
	RequestStatusCompleted RequestStatus = 2

	// RequestStatusBrowserDisconnected 浏览器已断开连接
	RequestStatusBrowserDisconnected RequestStatus = 3

	// RequestStatusTimeout 请求超时
	RequestStatusTimeout RequestStatus = 4

	// RequestStatusError 传输错误
	RequestStatusError RequestStatus = 5

	// RequestStatusCancelled 请求被取消
	RequestStatusCancelled RequestStatus = 6
)

// String 返回状态的字符串表示
func (s RequestStatus) String() string {
	switch s {
	case RequestStatusPending:
		return "PENDING"
	case RequestStatusReceiving:
		return "RECEIVING"
	case RequestStatusCompleted:
		return "COMPLETED"
	case RequestStatusBrowserDisconnected:
		return "BROWSER_DISCONNECTED"
	case RequestStatusTimeout:
		return "TIMEOUT"
	case RequestStatusError:
		return "ERROR"
	case RequestStatusCancelled:
		return "CANCELLED"
	default:
		return fmt.Sprintf("UNKNOWN(%d)", s)
	}
}

// ShouldStopSending 判断客户端是否应该停止发送
func (s RequestStatus) ShouldStopSending() bool {
	return s == RequestStatusBrowserDisconnected ||
		s == RequestStatusTimeout ||
		s == RequestStatusError ||
		s == RequestStatusCancelled ||
		s == RequestStatusCompleted
}

// RequestStatusManager 请求状态管理器
type RequestStatusManager struct {
	statuses sync.Map // requestID -> RequestStatus
}

// NewRequestStatusManager 创建请求状态管理器
func NewRequestStatusManager() *RequestStatusManager {
	return &RequestStatusManager{}
}

// SetStatus 设置请求状态
func (m *RequestStatusManager) SetStatus(requestID string, status RequestStatus) {
	m.statuses.Store(requestID, status)
}

// GetStatus 获取请求状态
func (m *RequestStatusManager) GetStatus(requestID string) (RequestStatus, bool) {
	value, ok := m.statuses.Load(requestID)
	if !ok {
		return RequestStatusPending, false
	}
	return value.(RequestStatus), true
}

// DeleteStatus 删除请求状态
func (m *RequestStatusManager) DeleteStatus(requestID string) {
	m.statuses.Delete(requestID)
}

// ShouldStopSending 判断客户端是否应该停止发送
func (m *RequestStatusManager) ShouldStopSending(requestID string) bool {
	status, ok := m.GetStatus(requestID)
	if !ok {
		// 如果状态不存在，说明请求已被清理，应该停止发送
		return true
	}
	return status.ShouldStopSending()
}
